package com.bwie.codec;

import com.bwie.protocol.CustomProtocol;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

import java.util.Arrays;

/**
 * 自定义编码器，在消息首尾添加0x7e标识
 */
public class CustomEncoder extends MessageToByteEncoder<CustomProtocol> {
    // 数据包首尾标识
    private static final byte DELIMITER = (byte) 0x7e;

    @Override
    protected void encode(ChannelHandlerContext ctx, CustomProtocol msg, ByteBuf out) {
        // 写入首标识
        out.writeByte(DELIMITER);

        // 写入消息内容
        out.writeBytes(escape(msg.getContent()));

        // 写入字符串尾部标识
//        out.writeByte(0);

        // 写入尾标识
        out.writeByte(DELIMITER);
    }
    
    /**
     * 替换特殊字节的函数
     * 如果是0x7E替换为0x7D 0x02，如果是0x7D替换为0x7D 0x01
     * @param data 原始字节数组
     * @return 替换后的字节数组
     */
    public byte[] escape(byte[] data) {
        // 创建一个临时的字节数组存储替换后的数据，先分配一个较大的空间
        byte[] temp = new byte[data.length * 2];
        int index = 0;
        
        for (int i = 0; i < data.length; i++) {
            if (data[i] == (byte) 0x7E) {
                temp[index++] = (byte) 0x7D;
                temp[index++] = (byte) 0x02;
            } else if (data[i] == (byte) 0x7D) {
                temp[index++] = (byte) 0x7D;
                temp[index++] = (byte) 0x01;
            } else {
                temp[index++] = data[i];
            }
        }
        
        // 返回实际长度的数据
        return Arrays.copyOf(temp, index);
    }
}